<?php

if (! defined ( 'BASEPATH' ))
	exit ( 'No direct script access allowed' );
/**
 * CodeIgniter
 *
 * An open source application development framework for PHP 5.1.6 or newer
 *
 * @package		CodeIgniter
 * @author		ExpressionEngine Dev Team
 * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc.
 * @license		http://codeigniter.com/user_guide/license.html
 * @link		http://codeigniter.com
 * @since		Version 1.0
 * @filesource
 */

// ------------------------------------------------------------------------


/**
 * CodeIgniter Hooks Class
 *
 * Provides a mechanism to extend the base system without hacking.
 *
 * @package		CodeIgniter
 * @subpackage	Libraries
 * @category	Libraries
 * @author		ExpressionEngine Dev Team
 * @link		http://codeigniter.com/user_guide/libraries/encryption.html
 */
class CI_Hooks {
	
	var $enabled = FALSE;
	var $hooks = array ();
	var $in_progress = FALSE;
	
	/**
	 * Constructor
	 *
	 */
	function __construct() {
		$this->_initialize ();
		log_message ( 'debug', "Hooks Class Initialized" );
	}
	
	// --------------------------------------------------------------------
	

	/**
	 * Initialize the Hooks Preferences
	 *
	 * @access	private
	 * @return	void
	 */
	function _initialize() {
		$CFG = & load_class ( 'Config', 'core' );
		
		// If hooks are not enabled in the config file
		// there is nothing else to do
		

		if ($CFG->item ( 'enable_hooks' ) == FALSE) {
			return;
		}
		
		// Grab the "hooks" definition file.
		// If there are no hooks, we're done.
		

		if (defined ( 'ENVIRONMENT' ) and is_file ( APPPATH . 'config/' . ENVIRONMENT . '/hooks.php' )) {
			include (APPPATH . 'config/' . ENVIRONMENT . '/hooks.php');
		} elseif (is_file ( APPPATH . 'config/hooks.php' )) {
			include (APPPATH . 'config/hooks.php');
		}
		
		if (! isset ( $hook ) or ! is_array ( $hook )) {
			return;
		}
		
		$this->hooks = & $hook;
		$this->enabled = TRUE;
	}
	
	// --------------------------------------------------------------------
	

	/**
	 * Call Hook
	 *
	 * Calls a particular hook
	 *
	 * @access	private
	 * @param	string	the hook name
	 * @return	mixed
	 */
	function _call_hook($which = '') {
		if (! $this->enabled or ! isset ( $this->hooks [$which] )) {
			return FALSE;
		}
		
		if (isset ( $this->hooks [$which] [0] ) and is_array ( $this->hooks [$which] [0] )) {
			foreach ( $this->hooks [$which] as $val ) {
				$this->_run_hook ( $val );
			}
		} else {
			$this->_run_hook ( $this->hooks [$which] );
		}
		
		return TRUE;
	}
	
	// --------------------------------------------------------------------
	

	/**
	 * Run Hook
	 *
	 * Runs a particular hook
	 *
	 * @access	private
	 * @param	array	the hook details
	 * @return	bool
	 */
	function _run_hook($data) {
		if (! is_array ( $data )) {
			return FALSE;
		}
		
		// -----------------------------------
		// Safety - Prevents run-away loops
		// -----------------------------------
		

		// If the script being called happens to have the same
		// hook call within it a loop can happen
		

		if ($this->in_progress == TRUE) {
			return;
		}
		
		// -----------------------------------
		// Set file path
		// -----------------------------------
		

		if (! isset ( $data ['filepath'] ) or ! isset ( $data ['filename'] )) {
			return FALSE;
		}
		
		$filepath = APPPATH . $data ['filepath'] . '/' . $data ['filename'];
		
		if (! file_exists ( $filepath )) {
			return FALSE;
		}
		
		// -----------------------------------
		// Set class/function name
		// -----------------------------------
		

		$class = FALSE;
		$function = FALSE;
		$params = '';
		
		if (isset ( $data ['class'] ) and $data ['class'] != '') {
			$class = $data ['class'];
		}
		
		if (isset ( $data ['function'] )) {
			$function = $data ['function'];
		}
		
		if (isset ( $data ['params'] )) {
			$params = $data ['params'];
		}
		
		if ($class === FALSE and $function === FALSE) {
			return FALSE;
		}
		
		// -----------------------------------
		// Set the in_progress flag
		// -----------------------------------
		

		$this->in_progress = TRUE;
		
		// -----------------------------------
		// Call the requested class and/or function
		// -----------------------------------
		

		if ($class !== FALSE) {
			if (! class_exists ( $class )) {
				require ($filepath);
			}
			
			$HOOK = new $class ();
			$HOOK->$function ( $params );
		} else {
			if (! function_exists ( $function )) {
				require ($filepath);
			}
			
			$function ( $params );
		}
		
		$this->in_progress = FALSE;
		return TRUE;
	}

}

// END CI_Hooks class

/* End of file Hooks.php */
/* Location: ./system/core/Hooks.php */